# Горутины в Go
Горутины - это легковесные потоки выполнения, которые создаются с помощью ключевого слова `go` перед вызовом функции. Они позволяют эффективно использовать ресурсы процессора и выполнять задачи параллельно.

## Преимущества

- **Эффективное использование ресурсов**: Горутины имеют низкое потребление памяти и могут быть эффективно запущены на многоядерных процессорах.
- **Простота создания и управления**: Создание и управление горутинами в Go очень просто, благодаря встроенной поддержке языка.
- **Возможность параллельного выполнения задач**: Горутины позволяют параллельно выполнять различные задачи, что повышает производительность программы.

## Примеры использования

```go
package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", handler)
    
    go func() {
        if err := http.ListenAndServe(":8080", nil); err != nil {
            fmt.Println("Server error:", err)
        }
    }()
    
    fmt.Println("Server started at http://localhost:8080")
    
    var input string
    fmt.Scanln(&input)
    
    fmt.Println("Server stopped")
}

func handler(w http.ResponseWriter, r *http.Request) {
    go func() {
        _, err := fmt.Fprintf(w, "Hello, World!")
        if err != nil {
            fmt.Println("Error handling request:", err)
        }
    }()
}
```

# Каналы

**Каналы** в Go - это механизм для передачи данных между горутинами. Они обеспечивают безопасную и эффективную коммуникацию между горутинами.

```go
func main() {
    ch := make(chan int)
    go func() {
        ch <- 42
    }()
    value := <-ch
    fmt.Println("Received:", value)
}
```

# Мьютекс

**Мьютексы** - это механизмы блокировки, используемые для обеспечения безопасного доступа к общим ресурсам из разных горутин.

```go
import "sync"

var mu sync.Mutex
var sharedResource int

func main() {
    mu.Lock()
    sharedResource = 42
    mu.Unlock()
}
```


# Panic recovery

```go
func main() {
    state := make(chan int)
    go func() {
        currentState := <-state
        fmt.Println(currentState)
    }()
    state <- 42
}


func myRoutine() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered from panic:", r)
        }
    }()
}

go myRoutine()
```

# ErrGroup w/ Goroutines

![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/b52/45f/cff/b5245fcff9c43a0cef31804033e6f6fc.png)

## Signal

```go
package main

import "fmt"

func main() {
    done := make(chan struct{})
    go func() {
        // Выполнение работы горутины
        close(done)
    }()
    <-done 
    fmt.Println("Горутина завершила выполнение")
}
```